| Conditions | 1 |
| Paths | 96 |
| Total Lines | 252 |
| Lines | 0 |
| Ratio | 0 % |
| Changes | 0 | ||
Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.
For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.
Commonly applied refactorings include:
If many parameters/temporary variables are present:
| 1 | /** |
||
| 23 | $.fn.symphonyNotify = function(options) { |
||
| 24 | var objects = this, |
||
| 25 | settings = { |
||
| 26 | items: 'p.notice', |
||
| 27 | storage: 'symphony.notify.' + Symphony.Context.get('root').replace('http://', '') |
||
| 28 | }; |
||
| 29 | |||
| 30 | $.extend(settings, options); |
||
| 31 | |||
| 32 | /*-----------------------------------------------------------------------*/ |
||
| 33 | |||
| 34 | Symphony.Language.add({ |
||
| 35 | 'Ignore?': false, |
||
| 36 | 'next': false, |
||
| 37 | 'at': false |
||
| 38 | }); |
||
| 39 | |||
| 40 | /*------------------------------------------------------------------------- |
||
| 41 | Events |
||
| 42 | -------------------------------------------------------------------------*/ |
||
| 43 | |||
| 44 | // Attach message |
||
| 45 | objects.on('attach.notify', function attachMessage(event, message, type) { |
||
| 46 | var object = $(this), |
||
| 47 | notifier = object.find('div.notifier'), |
||
| 48 | items = notifier.find(settings.items), |
||
| 49 | item, storage; |
||
| 50 | |||
| 51 | notifier.trigger('attachstart.notify'); |
||
| 52 | |||
| 53 | // Create item |
||
| 54 | item = $('<p />', { |
||
| 55 | 'class': type |
||
| 56 | }).html(message.replace(Symphony.Language.get('at') + ' ', '')).addClass('notice active').symphonyTimeAgo(); |
||
| 57 | |||
| 58 | // Add ignore link to notices) |
||
| 59 | if(!item.is('.error') && !item.is('.success') && !item.is('.protected')) { |
||
| 60 | item.html(item.html() + ' <a class="ignore">' + Symphony.Language.get('Ignore?') + '</a>'); |
||
| 61 | } |
||
| 62 | |||
| 63 | // Add navigator |
||
| 64 | $('<nav />', { |
||
| 65 | text: Symphony.Language.get('next') |
||
| 66 | }).hide().appendTo(item); |
||
| 67 | |||
| 68 | // Load exclusion rules |
||
| 69 | if(Symphony.Support.localStorage === true) { |
||
| 70 | storage = (window.localStorage[settings.storage]) ? $.parseJSON(window.localStorage[settings.storage]) : []; |
||
| 71 | } |
||
| 72 | |||
| 73 | // Dimmed success transition |
||
| 74 | if (!!type && !!~type.indexOf('success')) { |
||
| 75 | setTimeout(function () { |
||
| 76 | item.addClass('dimmed'); |
||
| 77 | }, 10000); |
||
| 78 | } |
||
| 79 | |||
| 80 | // Prepend item |
||
| 81 | if($.inArray(item.text(), storage) == -1) { |
||
|
|
|||
| 82 | items.removeClass('active'); |
||
| 83 | item.addClass('active').prependTo(notifier); |
||
| 84 | notifier.scrollTop(0); |
||
| 85 | |||
| 86 | notifier.trigger('attachstop.notify', [item]); |
||
| 87 | } |
||
| 88 | else { |
||
| 89 | notifier.trigger('attachcancel.notify', [item]); |
||
| 90 | } |
||
| 91 | }); |
||
| 92 | |||
| 93 | // Detach message |
||
| 94 | objects.on('detach.notify', settings.items, function detachMessage(event) { |
||
| 95 | var item = $(this), |
||
| 96 | notifier = item.parents('div.notifier'); |
||
| 97 | |||
| 98 | notifier.trigger('detachstart.notify', [item]); |
||
| 99 | |||
| 100 | // Prepare item removal |
||
| 101 | notifier.one('movestop.notify', function(event) { |
||
| 102 | var notifier = $(this), |
||
| 103 | offset = notifier.scrollTop(); |
||
| 104 | |||
| 105 | // Adjust offset |
||
| 106 | if(offset > 0) { |
||
| 107 | notifier.scrollTop(offset - item.outerHeight()); |
||
| 108 | } |
||
| 109 | |||
| 110 | // Remove item |
||
| 111 | item.remove(); |
||
| 112 | |||
| 113 | notifier.trigger('detachstop.notify', [item]); |
||
| 114 | }); |
||
| 115 | |||
| 116 | // Fade item |
||
| 117 | item.animate({ |
||
| 118 | opacity: 0 |
||
| 119 | }, 'normal', function removeItem() { |
||
| 120 | |||
| 121 | // No other items |
||
| 122 | if(item.siblings().length == 0) { |
||
| 123 | notifier.trigger('resize.notify', [$('<div />')]); |
||
| 124 | } |
||
| 125 | |||
| 126 | // More item |
||
| 127 | else { |
||
| 128 | notifier.trigger('move.notify'); |
||
| 129 | } |
||
| 130 | |||
| 131 | // Remove item |
||
| 132 | item.remove(); |
||
| 133 | notifier.trigger('detachstop.notify', [item]); |
||
| 134 | }); |
||
| 135 | }); |
||
| 136 | |||
| 137 | // Resize notifier |
||
| 138 | objects.on('resize.notify attachstop.notify', 'div.notifier', function resizeNotifer(event, item) { |
||
| 139 | var notifier = $(this); |
||
| 140 | |||
| 141 | // Adjust height |
||
| 142 | if(!notifier.hasClass('constructing')) { |
||
| 143 | var active = item || notifier.find('.active:not(:animated)'); |
||
| 144 | |||
| 145 | notifier.show().animate({ |
||
| 146 | height: active.innerHeight() || 0 |
||
| 147 | }, 100); |
||
| 148 | } |
||
| 149 | }); |
||
| 150 | |||
| 151 | // Count messages |
||
| 152 | objects.on('attachstop.notify detachstop.notify', 'div.notifier', function toggleNavigator(event) { |
||
| 153 | var notifier = $(this), |
||
| 154 | items = notifier.find(settings.items); |
||
| 155 | |||
| 156 | // Hide navigator |
||
| 157 | if(items.length == 1) { |
||
| 158 | items.find('nav').hide(); |
||
| 159 | } |
||
| 160 | |||
| 161 | // Show navigator |
||
| 162 | else { |
||
| 163 | items.find('nav').show(); |
||
| 164 | } |
||
| 165 | }); |
||
| 166 | |||
| 167 | // Next message |
||
| 168 | objects.on('click', 'nav', function switchMessage(event) { |
||
| 169 | var nav = $(this), |
||
| 170 | notifier = $(this).closest('div.notifier'); |
||
| 171 | |||
| 172 | // Move messages |
||
| 173 | notifier.trigger('move.notify'); |
||
| 174 | }); |
||
| 175 | |||
| 176 | // Move messages |
||
| 177 | objects.on('move.notify', 'div.notifier', function moveMessage(event) { |
||
| 178 | var notifier = $(this), |
||
| 179 | current = notifier.find('.active'), |
||
| 180 | next = current.next(settings.items), |
||
| 181 | from = current.outerHeight(), |
||
| 182 | offset; |
||
| 183 | |||
| 184 | notifier.trigger('movestart.notify'); |
||
| 185 | |||
| 186 | // Deactivate current message |
||
| 187 | current.removeClass('active'); |
||
| 188 | |||
| 189 | // Activate next message and get offset |
||
| 190 | if(next.length > 0) { |
||
| 191 | next.addClass('active'); |
||
| 192 | offset = notifier.scrollTop() + from; |
||
| 193 | } |
||
| 194 | else { |
||
| 195 | next = notifier.find(settings.items).first().addClass('active'); |
||
| 196 | offset = 0; |
||
| 197 | } |
||
| 198 | |||
| 199 | // If next's height is not the same, resize first |
||
| 200 | if(next.outerHeight() !== from) { |
||
| 201 | notifier.trigger('resize.notify'); |
||
| 202 | } |
||
| 203 | |||
| 204 | // Move to next message |
||
| 205 | notifier.animate({ |
||
| 206 | scrollTop: offset |
||
| 207 | }, 'fast', function stopMovingMessage() { |
||
| 208 | notifier.trigger('movestop.notify'); |
||
| 209 | }); |
||
| 210 | }); |
||
| 211 | |||
| 212 | // Ignore message |
||
| 213 | objects.on('click', 'a.ignore', function ignoreMessage(event) { |
||
| 214 | var ignore = $(this), |
||
| 215 | item = ignore.parents(settings.items), |
||
| 216 | notifier = item.parents('div.notifier'), |
||
| 217 | text = item.text(), |
||
| 218 | storage; |
||
| 219 | |||
| 220 | // Store exclusion rule |
||
| 221 | if(Symphony.Support.localStorage === true) { |
||
| 222 | // Put in a try/catch incase we exceed storage space |
||
| 223 | try { |
||
| 224 | storage = (window.localStorage[settings.storage]) ? $.parseJSON(window.localStorage[settings.storage]) : []; |
||
| 225 | storage.push(text); |
||
| 226 | window.localStorage[settings.storage] = JSON.stringify(storage); |
||
| 227 | } |
||
| 228 | catch(e) { |
||
| 229 | window.onerror(e.message); |
||
| 230 | } |
||
| 231 | } |
||
| 232 | |||
| 233 | // Remove item |
||
| 234 | item.trigger('detach.notify'); |
||
| 235 | }); |
||
| 236 | |||
| 237 | /*------------------------------------------------------------------------- |
||
| 238 | Initialisation |
||
| 239 | -------------------------------------------------------------------------*/ |
||
| 240 | |||
| 241 | // Build interface |
||
| 242 | objects.each(function initNotify() { |
||
| 243 | var object = $(this), |
||
| 244 | notifier = $('<div class="notifier" />').hide().prependTo(object), |
||
| 245 | items = $(object.find(settings.items).get().reverse()); |
||
| 246 | |||
| 247 | // Construct notifier |
||
| 248 | notifier.addClass('constructing'); |
||
| 249 | notifier.height(items.last().innerHeight()); |
||
| 250 | items.each(function buildMessages() { |
||
| 251 | var item = $(this).remove(), |
||
| 252 | message = item.html(), |
||
| 253 | type = item.attr('class'); |
||
| 254 | |||
| 255 | object.trigger('attach.notify', [message, type]); |
||
| 256 | }); |
||
| 257 | |||
| 258 | // Resize notifier |
||
| 259 | if(notifier.find(settings.items).length > 0) { |
||
| 260 | notifier.removeClass('constructing').trigger('resize.notify'); |
||
| 261 | } |
||
| 262 | |||
| 263 | notifier.removeClass('constructing'); |
||
| 264 | |||
| 265 | // Update relative times in system messages |
||
| 266 | setInterval(function updateRelativeTimes() { |
||
| 267 | $('header p.notice').symphonyTimeAgo(); |
||
| 268 | }, 60000); |
||
| 269 | }); |
||
| 270 | |||
| 271 | /*-----------------------------------------------------------------------*/ |
||
| 272 | |||
| 273 | return objects; |
||
| 274 | }; |
||
| 275 | |||
| 277 |